/**
 * UFCG - CEEI - DSC- SI1
 * Projeto da Disciplina Sistema de Informacao 1 - 2011.1
 * 
 * Professor: Hyggo Almeida
 * 
 * Alunos: Felipe de Sousa - felipeso@lcc.ufcg.edu.br
 * 		   Matheus Sampaio - matheusss@lcc.ufcg.edu.br
 *         Henrique Florencio - henriquecf@lcc.ufcg.edu.br
 *         Claudio Cardoso - claudiocaj@lcc.ufcg.edu.br
 * 		   Julio Henrrique - juliohr@lcc.ufcg.edu.br
 * 
 */

package util;

import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Pacote de Utilidade que serao usadas em todo o Projeto
 * 
 */

public class Input {

	private static Scanner sc = new Scanner(System.in);

	public static String nextLine() {
		return nextLine("", 3);
	}

	public static String nextLine(String msg) {
		return nextLine(msg, 3);
	}

	public static String nextLine(String msg, int type) {
		final int onlyLetters = 0;
		final int onlyNum = 1;
		final int LettersAndNum = 2;
		final int allCaracter = 3;

		while (true) {
			System.out.print(msg);

			String out = sc.nextLine();

			if (type == onlyNum && out.matches("[0-9]+")) {
				return out;
			} else if (type == onlyLetters && out.matches("[a-zA-Z]+")) {
				return out;
			} else if (type == LettersAndNum && out.matches("[a-zA-Z0-9]+")) {
				return out;
			} else if (type == allCaracter) {
				return out;
			} else {
				System.out.println("Valor invalido.");
			}

		}
	}

	/**
	 * Metodo que verifica se a string contem apenas numeros
	 * 
	 * @param mensagem
	 *            um numero em formato de string
	 * @return o inteiro correspondente ao numero que veio na string
	 */
	public static int getInputInt(String mensagem) {
		Scanner sc = new Scanner(System.in);
		String palavra;
		while (true) {
			System.out.println(mensagem);
			palavra = sc.next();
			Pattern padrao = Pattern.compile("[0-9]+");
			Matcher pesquisa = padrao.matcher(palavra);
			if (pesquisa.matches()) {
				break;
			}
		}
		return Integer.parseInt(palavra);
	}

	/**
	 * Metodo que recebe uma String em formato de data e hora
	 * 
	 * @param mensagem
	 * @return a palavra com o formato dd/mm/aaaa hh:minmin
	 */

	public static String getStringData(String mensagem) {
		Scanner sc = new Scanner(System.in);
		String palavra;

		while (true) {
			System.out.println(mensagem);
			palavra = sc.nextLine();

			if (testaFormatoDataHora(palavra)) {
				break;
			}
		}

		return palavra;
	}

	/**
	 * Metodo que testa o formato da palavra
	 * 
	 * @param palavra
	 * @return true se o formato estiver certo ou false caso ao contrario
	 * 
	 */

	public static boolean testaFormatoDataHora(String palavra) {

		if (!(palavra.length() == 16)) {
			return false;
		}

		String dia = palavra.substring(0, 2);
		String mes = palavra.substring(3, 5);
		String ano = palavra.substring(6, 10);
		String hora = palavra.substring(11, 13);
		String minuto = palavra.substring(14, palavra.length());

		if (!(palavra.substring(2, 3).equals("/"))
				|| !(palavra.substring(5, 6).equals("/"))
				|| !(palavra.substring(10, 11).equals(" "))
				|| !(palavra.substring(13, 14).equals(":"))) {
			return false;
		}

		for (int i = 0; i < dia.length(); i++) {
			if (!Character.isDigit(dia.charAt(i))) {
				return false;
			}
		}

		if (Integer.parseInt(dia) > 31 || Integer.parseInt(dia) < 1) {
			System.out.println("Dia invalido");
			return false;
		}

		for (int i = 0; i < mes.length(); i++) {
			if (!Character.isDigit(mes.charAt(i))) {
				return false;
			}
		}

		if (Integer.parseInt(mes) > 12 || Integer.parseInt(mes) < 1) {
			System.out.println("Mes invalido");
			return false;
		}

		for (int i = 0; i < ano.length(); i++) {
			if (!Character.isDigit(ano.charAt(i))) {
				return false;
			}
		}

		for (int i = 0; i < hora.length(); i++) {
			if (!Character.isDigit(hora.charAt(i))) {
				return false;
			}
		}

		if (Integer.parseInt(hora) > 23 || Integer.parseInt(hora) < 00) {
			System.out.println("Hora invalida");
			return false;
		}

		for (int i = 0; i < minuto.length(); i++) {
			if (!Character.isDigit(minuto.charAt(i))) {
				return false;
			}
		}

		if (Integer.parseInt(minuto) > 59 || Integer.parseInt(minuto) < 00) {
			System.out.println("Minutos invalidos");
			return false;
		}

		return true;
	}

}
